﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SistemaDeBastanteodePoderes.Persistencia;
using NHibernate.Exceptions;
using SistemaDeBastanteodePoderes.Dominio;

namespace SistemaDeBastanteodePoderes.Negocio
{
    public class ClienteServiceImpl : IClienteService
    {
        #region region de dependencias
        IRepresentanteDAO representanteDAO = null;
        ITipoDocumentoDAO tipoDocDAO = null;
        IClienteDAO clienteDAO = null;
        ITipoEmpresaDAO tipoEmpDAO = null;
        IBastanteoDAO bastanteoDAO = null;
        ITipoIntervencionDAO tipoIntDAO = null;
        IPoderDAO poderDAO = null;
        ITipoServicioDAO tipoSerDAO = null;
        #endregion

        #region Operaciones de negocio REGISTRAR CLIENTES
        public Cliente RegistrarCliente(string NUM_RUC, string RAZ_SOCIAL,
            DateTime FEC_INI_OPER, int TIP_EMPRESA, int CNT_EMPLEADOS)
        {
            // Excepción si falta algún dato requerido
            if (NUM_RUC == null || RAZ_SOCIAL == null || FEC_INI_OPER == null ||
                TIP_EMPRESA <= 0 || CNT_EMPLEADOS <= 0)
                throw new DatosInsuficientesException("Faltan datos para crear cliente");
            // Excepción si ya se registrón el mismo cliente (por su RUC)
            if (clienteDAO.ObtenerPorRuc(NUM_RUC) != null)
                throw new EntidadRepetidaException("El cliente ya existe");
            // Creación del cliente
            Cliente clienteACrear = new Cliente();
            clienteACrear.nroRUC = NUM_RUC;
            clienteACrear.razSocial = RAZ_SOCIAL;
            clienteACrear.fecIniOperaciones = FEC_INI_OPER;
            clienteACrear.tipEmpresa = tipoEmpDAO.Obtener(TIP_EMPRESA);
            clienteACrear.cntEmpleados = CNT_EMPLEADOS;
            return clienteDAO.Crear(clienteACrear);
        }
        #endregion

        #region LISTAR DE CLIENTES
        public ICollection<Cliente> ListarClientes()
        {
            return clienteDAO.ListarTodos();
        }
        #endregion

        #region Métodos LISTAR Y  OBTENER TIPO EMPRESA
        public TipoEmpresa ObtenerTipoEmpresa(int codigo)
        {
            return tipoEmpDAO.Obtener(codigo);
        }
        public ICollection<TipoEmpresa> ListarTiposEmpresa()
        {
            return tipoEmpDAO.ListarTodos();
        }
        #endregion

    }
}
